/**
 * 2
 *  
 * @Author : Ruoyu Wang
 * @DateTime : 24-10-15 下午6:54
 */

#include <iostream>
#include <vector>
#include <random>
#include <string>

using namespace std;

random_device rd;
mt19937 rng(rd());

class Node {
public:
    char val;
    int priority;
    Node *left;
    Node *right;
    int size;

    Node(char val) : val(val), left(nullptr), right(nullptr), size(1) {
        priority = rng();
    }
};

class Treap {
public:
    Node *root;

    Treap() : root(nullptr) {}

    int size(Node *node) {
        return node ? node->size : 0;
    }

    void update(Node *node) {
        if (node) {
            node->size = 1 + size(node->left) + size(node->right);
        }
    }

    pair<Node *, Node *> split(Node *node, int k) {
        if (!node) return {nullptr, nullptr};
        if (size(node->left) >= k) {
            auto splitted = split(node->left, k);
            node->left = splitted.second;
            update(node);
            return {splitted.first, node};
        } else {
            auto splitted = split(node->right, k - size(node->left) - 1);
            node->right = splitted.first;
            update(node);
            return {node, splitted.second};
        }
    }

    Node *merge(Node *left, Node *right) {
        if (!left) return right;
        if (!right) return left;
        if (left->priority > right->priority) {
            left->right = merge(left->right, right);
            update(left);
            return left;
        } else {
            right->left = merge(left, right->left);
            update(right);
            return right;
        }
    }

    void inorder(Node *node, string &result) {
        if (!node) return;
        inorder(node->left, result);
        result += node->val;
        inorder(node->right, result);
    }

    void insert(char ch) {
        Node *newNode = new Node(ch);
        root = merge(root, newNode);
    }

    string getInOrder() {
        string result;
        inorder(root, result);
        return result;
    }
};

int main() {
    string s;
    getline(cin, s);

    Treap treap;

    for (char ch: s) {
        treap.insert(ch);
    }

    for (int i = 1; i <= s.size(); i++) {
        if (i > treap.size(treap.root)) break;

        auto split1 = treap.split(treap.root, i - 1);
        auto split2 = treap.split(split1.second, 1);
        Node *toMove = split2.first;
        Node *rest = split2.second;

        treap.root = treap.merge(split1.first, rest);
        treap.root = treap.merge(treap.root, toMove);
    }

    cout << treap.getInOrder() << endl;

    return 0;
}

//void change(vector<int> &vec, int l, int r) {
//    if (l == r)return;
//    int tmp[r - l + 1];
//    int idx = 0;
//    for (int i = l + 1; i <= r; i += 2) {
//        tmp[idx++] = vec[i];
//    }
//    int mid = idx;
//    for (int i = l; i <= r; i += 2) {
//        tmp[idx++] = vec[i];
//    }
//    for (int i = 0, j = l; j <= r; ++i, ++j) {
//        vec[j] = tmp[i];
//    }
//    change(vec, l+mid, r);
//}
//
//int main() {
//    int n;
//    cin >> n;
//
//    vector<int> vec(n);
//
//    for (int i = 0; i < n; ++i) {
//        vec[i] = i;
//    }
//
//    change(vec, 0, vec.size()-1);
//
//    for (int i = 0; i < n; ++i) {
//        cout << vec[i] << " ";
//    }
//    cout << endl;
//
//    return 0;
//}

//int main() {
//    int n;
//    cin >> n;
//
//    vector<int> vec(n);
//
//    for (int i = 0; i < n; ++i) {
//        vec[i] = i;
//    }
//
//    for (int i = 0; i < n; ++i) {
//        int tmp = vec[i];
//        for (int j = i; j < n - 1; ++j) {
//            vec[j] = vec[j + 1];
//        }
//        vec[n - 1] = tmp;
//    }
//
//    for (int i = 0; i < n; ++i) {
//        cout << vec[i] << " ";
//    }
//    cout << endl;
//
//    return 0;
//}

//int main() {
//    string input;
//    cin >> input;
//
//    string res = input;
//
//    for (int i = 0; i < input.length(); i++) {
//        char ch = res[i];
//        res.erase(i, 1);
//        res += ch;
//    }
//
//    cout << res << endl;
//
//    return 0;
//}

